package reflect;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
 * 反射机制访问私有方法
 */
public class ReflectDemo7 {
    public static void main(String[] args) throws Exception {
        Class cls =Class.forName("reflect.Person");
        Object obj =cls.newInstance();//实例化对象
 /*
            当我们使用Class的getMethod方法获取一个类的私有方法时,会抛出下面异常:
            java.lang.NoSuchMethodException
                      没有这个方法异常
            原因:
            getMethod()方法仅能获取类对象表示的类的所有公开方法(包括从超类继承的方法)

            Class类对象有一组可以获取本类自己定义的成员
            getDeclaredXXXX()
            例如:
            getDeclaredMethods()
            能获取到类对象表示的类中定义的所有方法(包括私有方法,不包含超类继承的)

            getDeclaredMethod(String name,Class... pt)
         */
        Method method = cls.getDeclaredMethod("hehe");
        if (method.getModifiers()== Modifier.PRIVATE){//判断是否为私有方法
            method.setAccessible(true);//是；强制打开权限
            method.invoke(obj);//调用方法
            method.setAccessible(false);//用完后关闭权限
        }else {
            method.invoke(obj);//正常打开权限
        }

    }
}
